//
// Created by denglibin on 2021/8/11.
//

#include "FirstFrame.h"
//#include "eclipse_32_32_XP.XPM" //图标
#include <iostream>
using namespace  std;
/**
  * 构造函数
  * @param title
  */
FirstFrame::FirstFrame(const wxString& title)
//调用基类的构造函数，窗口标识(wxID_ANY标识让wxWidgets自己选择一个)
:wxFrame(nullptr, wxID_ANY, title){
    this->initFrame();
    this->initMenu();
    this->initStatusBar();
    this->initComponent();

}
FirstFrame::~FirstFrame(){
    delete this->okButton;
    delete this->textCtrl;
    this->okButton = nullptr;
    this->textCtrl = nullptr;
}
/**
 * 事件处理函数
 * 当用户点击退出菜单项的时候OnQuit函数被调用
 * @param event
 */
void FirstFrame::OnQuit(wxCommandEvent& event){
    //调用wxFrame类的Close函数来释放frame窗口。因为没有别的窗口存在了，所以就触
    //发了应用程序的退出，实际上，wxFrame类的Close函数并不直接关闭frame窗口，而是产生一个
    //wxEVT CLOSE WINDOW事件，这个事件默认的处理函数调用wxWindow::Destroy函数释放了frame窗口
    this->Close();
}
/**
 * 事件处理函数
 * @param event
 */
void FirstFrame::OnAbout(wxCommandEvent& event){
    wxString msg;
    msg.Printf(wxT("Hello and welcome to %s"), wxVERSION_STRING);
    //当用户点击关于菜单项的时候，MyFrame::OnAbout函数弹出一个消息框。这用到了wxWidgets提
    //供的API wxMessageBox,它的四个参数分别代表消息内容，标题，窗口类型以及父窗口
    wxMessageBox(msg, wxT("About Minimal"), wxOK | wxICON_INFORMATION, this);
}

/**
 * 事件处理函数
 * @param event
 */
void FirstFrame::OnSize_(wxSizeEvent& event){
    //auto size = event.GetSize();
    //cout << "OnSize:" << size.x << "," << size.y << endl;
}

/**
 * 事件处理函数
 * @param event
 */
void FirstFrame::OnButtonOK(wxCommandEvent& event){
    //cout << "ok click " << (this->okButton == event.GetEventObject()) << endl;
    //cout << this->textCtrl->GetLabelText() << endl;
    cout << this->textCtrl->GetLineText(0) << endl;
    this->textCtrl->Clear();
}

void FirstFrame::initFrame(){
    //设置图标
    //this->SetIcon(wxIcon(eclipse_32_32_XP_xpm));
    //设置窗口位置
    wxPoint position;
    position.x = 300;
    position.y = 300;
    SetPosition(position);
    //设置背景色
    wxColour backGroundColor(0,128,0);
    this->SetBackgroundColour(backGroundColor);
    //设置宽高
    this->m_minWidth = 800;
    this->m_minHeight = 600;
}

void FirstFrame::initMenu(){
    //菜单项
    auto* fileMenu = new wxMenu;
    auto* helpMenu = new wxMenu;

    //添加子项
    //增加菜单项的Append函数的三个参数的意义分别为：菜单项标识，菜单
    //上的文本以及一个稍微长一些的帮助字符串。这个帮助字符串会在菜单项被高亮显示的时候自动显
    //示在状态栏上。菜单上的文本中由"&"符号前导的字符将成为菜单的快捷操作符，在实际的显示中用
    //下划线表示。而"\t"符号则前导一个全局的快捷键，这个快捷键可以在菜单项没有被打开的时候触
    //发菜单功能
    helpMenu->Append(wxID_ABOUT, wxT("关于...\tF1"), wxT("Show about dialog"));
    fileMenu->Append(wxID_EXIT, wxT("E&xit\tAlt-X"), wxT("Quit this program"));

    //菜单栏
    auto* menuBar = new wxMenuBar();
    //添加两个菜单项
    menuBar->Append(fileMenu, wxT("&File"));
    menuBar->Append(helpMenu, wxT("&Help"));
    this->SetMenuBar(menuBar);
}

void FirstFrame::initStatusBar(){
    //状态栏
    this->CreateStatusBar(2);
    this->SetStatusText(wxT("Welcome to xWidgets!"), 0);
    this->SetStatusText(wxT("欢迎"), 1);
}

void FirstFrame::initComponent(){
    this->okButton = new wxButton(this, wxID_OK, wxT("OK"), wxPoint(480, 36), wxSize(64, 24));
    this->textCtrl = new MyTextCtrl(this, wxID_EDIT, wxPoint(50, 36), wxSize(400, 24));
}

//实现事件表
//所谓事件表，是一组位于类的实现文件（.cpp文件）中的宏，用来告诉wxWidgets来自用户或者
//其它地方的事件应该怎样和类的成员函数对应起来。
//静态事件映射（动态事件影视使用 frame->Connect 函数）
BEGIN_EVENT_TABLE(FirstFrame, wxFrame)
    EVT_MENU(wxID_ABOUT, FirstFrame::OnAbout) //关于
    //EVT_MENU(wxID_EXIT, FirstFrame::OnQuit) //退出
    //EVT SIZE事件映射宏不需要标识符参数,这个事件只能被产生这个事件的控件所处理
    EVT_SIZE(         FirstFrame::OnSize_ )
    //EVT BUTTON这一行将导致当frame窗口及其子窗口中标识符为wxID OK的按钮被点击的时候，
    //OnButtonOK函数被调用。这个例子表明，事件可以不必被产生这个事件的控件所处理
    EVT_BUTTON(wxID_OK, FirstFrame::OnButtonOK)
END_EVENT_TABLE()